package com.audaque.springboot.foshanupload.web.quartzdemo.controller;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

import static org.quartz.TriggerBuilder.newTrigger;

/**
 * @author zgb
 * @desc ...
 * @date 2023-04-30 13:04:26
 */
@Slf4j
@RestController
@RequestMapping("job")
public class JobController {

    @GetMapping("/myJob")
    public void myJob() throws Exception {
        this.job("com.audaque.springboot.foshanupload.web.quartzdemo.job.MyJob");
    }

    @GetMapping("/myStatusJob")
    public void myStatusJob() throws Exception {
        this.job("com.audaque.springboot.foshanupload.web.quartzdemo.job.MyStatusJob");
    }


    private void job(String className) throws Exception {
        // 1.创建任务定义实例
        JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(className)).withIdentity("job1", "group1")
                .withDescription("任务描述")
                .usingJobData("count", 1L)
                .build();

        // 2.构建Trigger实例,每隔30s执行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                //开启调度器后立刻执行
                .startNow()
                //设置调度计划
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(30).repeatForever())
                .usingJobData("tiggerDataMap", "测试传参")

                .build();

        //3.入任务定义实例和触发器
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.scheduleJob(jobDetail, trigger);
        // 4.开启调度器
        scheduler.start();

        //主线程睡眠1分钟，然后关闭调度器
        TimeUnit.MINUTES.sleep(1);
        // 5.关闭调度器
        /**
         *  shutdown(true)表示等待所有正在执行的任务执行完毕后关闭Scheduler
         *  shutdown(false),即shutdown()表示直接关闭Scheduler
         */
        scheduler.shutdown();
    }

    private void job1(String className) throws Exception {
        // 1.创建任务定义实例
        JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(className)).withIdentity("job1", "group1")
                .withDescription("任务描述")
                .usingJobData("count", 1L)
                //在用JobBuilder创建JobDetail的时候，有一个storeDurably()方法，可以在没有触发器指向任务的时候，使用 sched.addJob(job, true) 将任务保存在队列中了。而后使用 sched.scheduleJob 触发。如果不使用  storeDurably ，则在添加 Job 到引擎的时候会抛异常，意思就是该 Job 没有对应的 Trigger。
                .storeDurably()
                .build();

        // 2.构建Trigger实例
       String name= "trigger1";
       String group= "group1";
        CronTrigger trigger = newTrigger()
                .withIdentity(name, group)
                .startNow()
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("0/10 * 10-23 * * ?")
                                .withMisfireHandlingInstructionDoNothing())
                .build();
        //3.入任务定义实例和触发器
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.scheduleJob(jobDetail, trigger);
        // 4.开启调度器
        scheduler.start();

        //主线程睡眠1分钟，然后关闭调度器
        TimeUnit.MINUTES.sleep(1);


        //暂停某个任务
        JobKey jobKey = new JobKey(name, group);
        scheduler.pauseJob(jobKey);



        //主线程睡眠1分钟，然后关闭调度器
        TimeUnit.MINUTES.sleep(1);

        //恢复一个任务
        scheduler.resumeJob(jobKey);

        //修改某个任务的执行时间
        TriggerKey triggerKey = new TriggerKey(name, group);

        CronTrigger newTrigger = newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("0/1 * 10-23 * * ?")
                                .withMisfireHandlingInstructionDoNothing())
                .build();

        scheduler.rescheduleJob(triggerKey, newTrigger);

        //删除某个任务 删除后该任务将不再执行
        scheduler.deleteJob(jobKey);



        // 5.关闭调度器
        /**
         *  shutdown(true)表示等待所有正在执行的任务执行完毕后关闭Scheduler
         *  shutdown(false),即shutdown()表示直接关闭Scheduler
         */
        scheduler.shutdown();
    }


}
